package com.itheima.utils;


import org.junit.Test;
import org.springframework.web.multipart.MultipartFile;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * 这个类是POIUtils的增强版,需要依赖于POIUtils工具类
 */
public class POIUtilsEnhanced<T> {
    private static final String orderDate = "日期";
    private static final String number = "可预约数量";
    private final static String DATE_FORMAT = "yyyy/MM/dd";

    //参数是exceFile, 然后指定一个类的全限定名, 指定哪个类就封装到哪个类里面
    //因为我们不确定要把数据封装到哪个类中,因此返回值为List<T>,
    public List<T> getOrderSettingListFromExcelFile(MultipartFile excelFile, String className) {
        try {
            //0. 使用工具类,直接获得字符数组集合
            List<String[]> stringList = POIUtils.readExcel(excelFile);
            List<T> tList = new ArrayList<>();
            for (String[] strings : stringList) {   //遍历字符数据集合
                //每一个strings就对应一个实体类对象
                Class<T> clazz = (Class<T>) Class.forName(className);
                T t = clazz.newInstance();
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {//获取对象的所有属性值,去判断属性值上有没有Excel注解
                    field.setAccessible(true);//属性是私有的,因此不要忘记开启权限
                    if (field.isAnnotationPresent(Excel.class)) {//判断属性上方是否有@Excel注解
                        String colName = field.getAnnotation(Excel.class).colName();//获取注解中colName的值
                        if (colName.equals(orderDate)) {//判断colName值,如果值是"日期", 就把strings[0]赋值给它
                            field.set(t, new SimpleDateFormat(DATE_FORMAT).parse(strings[0]));
                        } else if (colName.equals(number)) {//如果值是"可预约数量", 就把strings[1]赋值给它
                            field.set(t, Integer.parseInt(strings[1]));
                        }
                    }
                }
                tList.add(t);
            }
            return tList;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("excel数据封装对象失败");
        }
    }

    //重载一下
    public List<T> getOrderSettingListFromExcelFile(MultipartFile excelFile, Class<T> clazz) {
        try {
            //0. 使用工具类,直接获得字符数组集合
            List<String[]> stringList = POIUtils.readExcel(excelFile);
            List<T> tList = new ArrayList<>();
            for (String[] strings : stringList) {   //遍历字符数据集合
                //每一个strings就对应一个实体类对象
                T t = clazz.newInstance();
                Field[] fields = clazz.getDeclaredFields();
                for (Field field : fields) {//获取对象的所有属性值,去判断属性值上有没有Excel注解
                    field.setAccessible(true);//属性是私有的,因此不要忘记开启权限
                    if (field.isAnnotationPresent(Excel.class)) {
                        String colName = field.getAnnotation(Excel.class).colName();//获取注解中colName的值
                        if (colName.equals(orderDate)) {//如果值是"日期", 就把strings[0]赋值给它
                            field.set(t, new SimpleDateFormat(DATE_FORMAT).parse(strings[0]));
                        } else if (colName.equals(number)) {//如果值是"可预约数量", 就把strings[1]赋值给它
                            field.set(t, Integer.parseInt(strings[1]));
                        }
                    }
                }
                tList.add(t);
            }
            return tList;
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("excel数据封装对象失败");
        }
    }


    @Test//效果测试
    public void testAnno() throws ClassNotFoundException {
        String className = "com.cui.POJO.OrderSetting";
        Class<?> aClass = Class.forName(className);
        for (Field field : aClass.getDeclaredFields()) {
            if (field.isAnnotationPresent(Excel.class)) {
                Excel annotation = field.getAnnotation(Excel.class);
                String colName = annotation.colName();
                System.out.println(colName);
            }
        }
    }
}
